# -*- coding: utf-8 -*-
'''
Created on 26 de Mar de 2011

@author: pedro
'''

from BeautifulSoup import BeautifulSoup
import pickle
import re
import urllib2

class RebidesURL(object):
    '''
    Faz o download da informacao da internet e guarda em listas
    '''
       
    urlBase = 'http://www.rebides.oces.mctes.pt/rebides0'
    urlTipoEstabelecimento = 'rebid_m1.asp?codr='
    urlEstabelecimento = '/rebid_m2.asp?CodR={0}&CodP=' 

   
    def criaUrl(self, ano, codTipoEstabelecimento=None, codEtabelecimento=None):
        '''
        Cria o url com as strings existentes e os codigos dos estabelecimentos
        ano = ano 
        codTipoEstablecimento = codigo tipo estabelecimento
        codEstablecimento = codigo do esbelecimento
        '''
        if codTipoEstabelecimento is None and codEtabelecimento is None:
            return self.urlBase + str(ano) + '/'
            pass
        elif codEtabelecimento is None:
            return self.criaUrl(ano) + self.urlTipoEstabelecimento + codTipoEstabelecimento
            pass
        else:
            return self.criaUrl(ano) + self.urlEstabelecimento.format(codTipoEstabelecimento) + codEtabelecimento
            pass
            
    def abrePagina(self, url):
        '''
        Abre a ligagcao com o site e retorna uma string com o html 
        url = 
        '''
        try:
            pagina = urllib2.urlopen(url)
        except:
            print "ERRO DE CONEXAO", url
            pass

        try:
            dados = pagina.read()
        except:
            print "ERRO DE LEITURA"
            pass
        else:
            pagina.close()
        return dados
        pass
    
    def bSoupParser(self, dados, codTipoEstabelecimento=None):
                  
        soup = BeautifulSoup(dados)
       
        d = {}
        
        lista = soup.findAll('a',)
       
        for r in lista:
            # href vai ter o conteudo da referencia em HTML
            href = r['href']
            
            if codTipoEstabelecimento is None:
                chave_procura = 'rebid\_m1\.asp\?codr\='
                pass
            else:
                chave_procura = 'rebid\_m2\.asp\?CodR\={0}\&CodP\='.format(codTipoEstabelecimento)
                pass
            href = re.sub(chave_procura, '', href)
            
            
            # o conteudo encontra-se do tag encontra-se aqui
            contents = r.contents
            
            # converte para utf-8
            conteudo = contents[0].encode('utf-8')
        
            d[ conteudo ] = href
            pass
            
        return d
    
    def obter_codigos_tipo_estabelecimento(self, ano):
        '''
        a funcao obtem os codigos dos tipos de estabelecimento
        de ensino superior
        
        ano - ano a que se referem os dados
        '''
        # url base do sistema Rebides
        url = self.criaUrl(ano)

        dados = self.abrePagina(url)
        
        d_tipos_estabelecimentos = self.bSoupParser(dados)
        
        return d_tipos_estabelecimentos


    


    def obter_codigos_estabelecimentos(self, ano, codTipoEstabelecimento):
        '''
        a funcao obtem os codigos dos tipos de estabelecimento
        de ensino superior
        
        ano - ano a que se referem os dados
        '''
        
        url = self.criaUrl(ano, codTipoEstabelecimento)
        dados = self.abrePagina(url)
        d_estabelecimentos = self.bSoupParser(dados, codTipoEstabelecimento)

        return d_estabelecimentos

    def bSoupDocentes(self, ano, dados, tipo, estabelecimento, codP):
        
        C_NOME_COMPLETO = 1
        C_GRAU = 3
        C_CURSO = 5
        C_CATEGORIA = 7
        C_REGIME = 9
        
        soup = BeautifulSoup(dados)
        
        lista = soup.findAll('tr',)
        
        lista_docentes = []

        for x in lista:
            nome = x.contents[C_NOME_COMPLETO].contents[0]

            grau = x.contents[C_GRAU].contents[0]
            grau = grau.lstrip()
            
            curso = x.contents[C_CURSO].contents[0]
            curso = curso.lstrip()

            categoria = x.contents[C_CATEGORIA].contents[0]

            regime = x.contents[C_REGIME].contents[0]

            conteudo = x.contents[11].findAll('a')
            for y in conteudo:
                # href vai ter o conteudo da referencia em HTML
                href = y['href']

                chave_procura = 'rebid\_m3\.asp\?CodD\='
                href = re.sub(chave_procura, '', href)

                chave_procura = '\&CodP\={0}'.format(codP)
                codigo_docente = re.sub(chave_procura, '', href)
                pass
            
            if nome != "NOME COMPLETO":
                if nome.encode('utf-8') != '&nbsp;':
                    nome_completo = nome
                    nome_completo = nome_completo.expandtabs()
                    novo_completo = re.sub('\015', '', nome_completo)
                    nome_completo = novo_completo.lstrip()
                    nome_completo = nome_completo.encode('utf-8')
                    
                    categoria_completo = categoria.lstrip()
                    categoria_completo = categoria_completo.encode('utf-8')

                    regime_completo = regime.lstrip()
                    regime_completo = regime_completo.encode('utf-8')
                    
                    codigo_docente_completo = codigo_docente
                    pass

                grau_completo = grau.encode('utf-8')
                curso_completo = curso.encode('utf-8')

                informacao_docente = [ codigo_docente_completo,
                                       nome_completo,
                                       grau_completo,
                                       curso_completo,
                                       categoria_completo,
                                       regime_completo,
                                       ano,
                                       tipo,
                                       estabelecimento]
                lista_docentes.append(informacao_docente)
                pass
            pass
        return lista_docentes

    def obter_informacao_docentes(self, ano, tipo, codR, estabelecimento, codP):
        '''
        codR - codigo do tipo de estabelecimento
        codP - codigo do estabelecimento
        '''
        url = self.criaUrl(ano, codR, codP)
        
        dados = self.abrePagina(url)

        lista_docentes = []
        lista_docentes = self.bSoupDocentes(ano, dados, tipo, estabelecimento, codP)

        return lista_docentes
    
